#include <string>
#include <stack>
using namespace std;

#ifndef RPN_H
#define	RPN_H

class RPN {
private:
    stack<double> val; // Стек для работы с константами из выражения.
    stack<char> oper; // Стек операций.
    string * Buff; // Исходная строка.
    int strBegIdx; // Указатель на начало следующей лексемы.
public:
    RPN(char * s); // Конструктор - калькулятор.
    virtual ~RPN();
    double result(); // Извлечение результата из стека.
    void print(); // Печать результата.
private:
    // Разбор выражения
    string* getNextPart(int& token); // Возвращает следующую лексему из строки и токен-параметр.
    // Константы
    double fromValToken(string * str); // Преобразование лексемы константы в double.
    double fromConstToken(string * str); // Раскрытие значений e и pi
    // Обратная польская запись
    char strToOper(string& s); // Кодируем операцию символом.
    int operPriority(char& c); // Приоритет оперции.
    void calculate(char& c); // Исполнение операции по символу-коду.
    // Автоматы
    int valMac(char c, int& state);
    bool valFin(int& state);
    int constMac(int c, int& state);
    bool constFin(int& state);
    int sepMac(char c, int& state);
    bool sepFin(int& state);
    int keywordMac(char c, int& state);
    bool keywordFin(int& state);
    int unknownMac(char c);
};

// Функции счета
    double summ(double,double);
    double substr(double,double);
    double mult(double,double);
    double divis(double,double);
    double inDegree(double,double);
    double invSign(double);
    double sinRPN(double);
    double cosRPN(double);

#endif	/* RPN_H */

